'''
Created on 2017年5月12日

@author: zhangyanfeng
'''
'''
异常处理并不仅仅处理那些直接发生在try子句中的异常，而且还能处理子句中调用的函数（甚至间接调用的函数）里抛出的异常。例如:
'''
def this_fails():
        x = 1/0
        
try:
    this_fails()       
except ZeroDivisionError as err:
    print('异常信息:',err)
    
 
'''
try except 语句还有一个可选的else子句，如果使用这个子句，那么必须放在所有的except子句之后。这个子句将在try子句没有发生任何异常的时候执行。例如:
'''   
for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print('cannot open', arg)
    else:
        print(arg, 'has', len(f.readlines()), 'lines')
        f.close()
'''
使用 else 子句比把所有的语句都放在 try 子句里面要好，这样可以避免一些意想不到的、而except又没有捕获的异常。
'''



'''
预定义的清理行为
一些对象定义了标准的清理行为，无论系统是否成功的使用了它，一旦不需要它了，那么这个标准的清理行为就会执行。
这面这个例子展示了尝试打开一个文件，然后把内容打印到屏幕上:
'''        
for line in open("myfile.txt"):
    print(line, end="")

'''
以上这段代码的问题是，当执行完毕后，文件会保持打开状态，并没有被关闭。
关键词 with 语句就可以保证诸如文件之类的对象在使用完之后一定会正确的执行他的清理方法:
'''                
with open("myfile.txt") as f:
    for line in f:
        print(line, end="")    

'''
以上这段代码执行完毕后，就算在处理过程中出问题了，文件 f 总是会关闭。
'''        
        